package org.beiji.frameworks.web;


import org.beiji.frameworks.convention.errorcode.BaseErrorCode;
import org.beiji.frameworks.convention.exception.AbstractException;
import org.beiji.frameworks.convention.result.Result;

import java.util.Optional;

/**
 * 全局返回对象构造器
 */
public class Results {

    /**
     * 构造成功响应
     * @return
     */
    public static Result<Void> success() {
        return new Result<Void>()
                .setCode(Result.SUCCESS_CODE);
    }

    /**
     * 构造成功并带有参数的响应
     * @param data
     * @return
     * @param <T>
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>()
                .setCode(Result.SUCCESS_CODE)
                .setData(data);
    }

    /**
     * 构造失败响应
     * @return
     */
    protected static Result<Void> failure() {
        return new Result<Void>()
                .setCode(BaseErrorCode.SERVICE_ERROR.code())
                .setMessage(BaseErrorCode.SERVICE_ERROR.message());
    }


    /**
     * 通过AbstractException构建失败响应
     * @param abstractException
     * @return
     */
    protected static Result<Void> failure(AbstractException abstractException){
        String errorCode = Optional.ofNullable(abstractException.getErrorCode())
                .orElse(BaseErrorCode.SERVICE_ERROR.code());

        String errorMessage = Optional.ofNullable(abstractException.getErrorMessage())
                .orElse(BaseErrorCode.SERVICE_ERROR.message());

        return new Result<Void>().setCode(errorCode).setMessage(errorMessage);
    }


    /**
     * 通过 errorCode errorMessage 构建失败响应
     * @param errorCode
     * @param errorMessage
     * @return
     */
    protected static Result<Void> failure(String errorCode, String errorMessage) {
        return new Result<Void>().setCode(errorCode).setMessage(errorMessage);
    }
}
